home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 398_01 / m08mch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-08  |  7.3 KB  |  440 lines

  1. /* m08mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1993
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6808.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1, t2, type;
  25.     struct expr e1, e2, e3;
  26.     addr_t espv;
  27.     struct area *espa;
  28.     char id[NCPS];
  29.     int c, v1;
  30.  
  31.     op = mp->m_valu;
  32.     type = mp->m_type;
  33.     switch (type) {
  34.  
  35.     case S_SDP:
  36.         e1.e_mode = 0;
  37.         e1.e_flag = 0;
  38.         e1.e_addr = 0;
  39.         e1.e_base.e_ap = NULL;
  40.         espa = NULL;
  41.         if (more()) {
  42.             expr(&e1, 0);
  43.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  44.                 if (e1.e_addr) {
  45.                     err('b');
  46.                 }
  47.             }
  48.             if ((c = getnb()) == ',') {
  49.                 getid(id, -1);
  50.                 espa = alookup(id);
  51.                 if (espa == NULL) {
  52.                     err('u');
  53.                 }
  54.             } else {
  55.                 unget(c);
  56.             }
  57.         }
  58.         if (espa) {
  59.             outdp(espa, &e1);
  60.         } else {
  61.             outdp(dot.s_area, &e1);
  62.         }
  63.         lmode = SLIST;
  64.         break;
  65.  
  66.     case S_INH:
  67.         outab(op);
  68.         break;
  69.  
  70.     case S_BRA:
  71.         expr(&e1, 0);
  72.         outab(op);
  73.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  74.             v1 = e1.e_addr - dot.s_addr - 1;
  75.             if ((v1 < -128) || (v1 > 127))
  76.                 aerr();
  77.             outab(v1);
  78.         } else {
  79.             outrb(&e1, R_PCR);
  80.         }
  81.         if (e1.e_mode != S_USER)
  82.             rerr();
  83.         break;
  84.  
  85.     case S_TYP1:
  86.         t1 = addr(&e1);
  87.         if (t1 == S_A) {
  88.             outab(op+0x10);
  89.             break;
  90.         }
  91.         if (t1 == S_X) {
  92.             outab(op+0x20);
  93.             break;
  94.         }
  95.         if (t1 == S_DIR || t1 == S_EXT) {
  96.             outab(op);
  97.             outrb(&e1, R_PAG0);
  98.             break;
  99.         }
  100.         if (t1 == S_IX) {
  101.             outab(op+0x40);
  102.             break;
  103.         }
  104.         if (t1 == S_IX1 || t1 == S_IX2) {
  105.             if (chkindx(&e1))
  106.                 aerr();
  107.             outab(op+0x30);
  108.             outrb(&e1, R_USGN);
  109.             break;
  110.         }
  111.         if (t1 == S_SP1 || t1 == S_SP2) {
  112.             if (chkindx(&e1))
  113.                 aerr();
  114.             outab(0x9e);
  115.             outab(op+0x30);
  116.             outrb(&e1, R_USGN);
  117.             break;
  118.         }
  119.         aerr();
  120.         break;
  121.  
  122.     case S_TYP2:
  123.         t1 = addr(&e1);
  124.         if (t1 == S_IMMED) {
  125.             if ((op == 0xA7) || (op == 0xAC) ||
  126.                 (op == 0xAD) || (op == 0xAF))
  127.                 aerr();
  128.             outab(op);
  129.             outrb(&e1, 0);
  130.             break;
  131.         }
  132.         if (t1 == S_DIR) {
  133.             outab(op+0x10);
  134.             outrb(&e1, R_PAG0);
  135.             break;
  136.         }
  137.         if (t1 == S_EXT) {
  138.             outab(op+0x20);
  139.             outrw(&e1, 0);
  140.             break;
  141.         }
  142.         if (t1 == S_IX) {
  143.             outab(op+0x50);
  144.             break;
  145.         }
  146.         if (t1 == S_IX1) {
  147.             outab(op+0x40);
  148.             outrb(&e1, R_USGN);
  149.             break;
  150.         }
  151.         if (t1 == S_IX2) {
  152.             outab(op+0x30);
  153.             outrw(&e1, 0);
  154.             break;
  155.         }
  156.         if (t1 == S_SP1) {
  157.             if (op == 0xAC || op == 0xAD)
  158.                 aerr();
  159.             outab(0x9e);
  160.             outab(op+0x40);
  161.             outrb(&e1, R_USGN);
  162.             break;
  163.         }
  164.         if (t1 == S_SP2) {
  165.             if (op == 0xAC || op == 0xAD)
  166.                 aerr();
  167.             outab(0x9e);
  168.             outab(op+0x30);
  169.             outrw(&e1, 0);
  170.             break;
  171.         }
  172.         aerr();
  173.         break;
  174.  
  175.     case S_TYP3:
  176.         t1 = addr(&e1);
  177.         espv = e1.e_addr;
  178.         if (t1 != S_IMMED || espv & ~0x07)
  179.             aerr();
  180.         comma();
  181.         t2 = addr(&e2);
  182.         if (t2 != S_DIR)
  183.             aerr();
  184.         outab(op + 2*(espv&0x07));
  185.         outrb(&e2, R_PAG0);
  186.         break;
  187.  
  188.     case S_TYP4:
  189.         t1 = addr(&e1);
  190.         espv = e1.e_addr;
  191.         if (t1 != S_IMMED || espv & ~0x07)
  192.             aerr();
  193.         comma();
  194.         t2 = addr(&e2);
  195.         if (t2 != S_DIR)
  196.             aerr();
  197.         comma();
  198.         expr(&e3, 0);
  199.         outab(op + 2*(espv&0x07));
  200.         outrb(&e2, R_PAG0);
  201.         if (e3.e_base.e_ap == NULL || e3.e_base.e_ap == dot.s_area) {
  202.             v1 = e3.e_addr - dot.s_addr - 1;
  203.             if ((v1 < -128) || (v1 > 127))
  204.                 aerr();
  205.             outab(v1);
  206.         } else {
  207.             outrb(&e3, R_PCR);
  208.         }
  209.         if (e3.e_mode != S_USER)
  210.             rerr();
  211.         break;
  212.  
  213.     case S_TYPAI:
  214.         t1 = addr(&e1);
  215.         if (t1 == S_IMMED) {
  216.             outab(op);
  217.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  218.                 v1 = e1.e_addr;
  219.                 if ((v1 < -128) || (v1 > 127))
  220.                     aerr();
  221.                 outab(v1);
  222.             } else {
  223.                 outrb(&e1, 0);
  224.             }
  225.             break;
  226.         }
  227.         aerr();
  228.         break;
  229.  
  230.     case S_TYPHX:
  231.         t1 = addr(&e1);
  232.         if (t1 == S_IMMED) {
  233.             if (op == 0x25)
  234.                 aerr();
  235.             outab(op);
  236.             outrw(&e1, 0);
  237.             break;
  238.         }
  239.         if (t1 == S_DIR || t1 == S_EXT) {
  240.             outab(op | 0x10);
  241.             outrb(&e1, R_PAG0);
  242.             break;
  243.         }
  244.         aerr();
  245.         break;
  246.  
  247.     case S_CBEQ:
  248.         t1 = addr(&e1);
  249.         comma();
  250.         expr(&e2, 0);
  251.         if (t1 == S_IMMED) {
  252.             outab(op);
  253.             outrb(&e1, 0);
  254.         } else
  255.         if (t1 == S_DIR || t1 == S_EXT) {
  256.             outab(op);
  257.             outrb(&e1, R_PAG0);
  258.         } else
  259.         if (t1 == S_IXP) {
  260.             outab(op+0x40);
  261.         } else
  262.         if (t1 == S_IX1P || t1 == S_IX2P) {
  263.             if (chkindx(&e1))
  264.                 aerr();
  265.             outab(op+0x30);
  266.             outrb(&e1, R_USGN);
  267.         } else
  268.         if (t1 == S_SP1 || t1 == S_SP2) {
  269.             if (chkindx(&e1))
  270.                 aerr();
  271.             outab(0x9E);
  272.             outab(op+0x30);
  273.             outrb(&e1, R_USGN);
  274.         } else {
  275.             aerr();
  276.             break;
  277.         }
  278.         if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
  279.             v1 = e2.e_addr - dot.s_addr - 1;
  280.             if ((v1 < -128) || (v1 > 127))
  281.                 aerr();
  282.             outab(v1);
  283.         } else {
  284.             outrb(&e2, R_PCR);
  285.         }
  286.         if (e2.e_mode != S_USER)
  287.             rerr();
  288.         break;
  289.  
  290.     case S_CQAX:
  291.         t1 = addr(&e1);
  292.         if (t1 != S_IMMED)
  293.             aerr();
  294.         comma();
  295.         expr(&e2, 0);
  296.         outab(op);
  297.         outrb(&e1, 0);
  298.         if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
  299.             v1 = e2.e_addr - dot.s_addr - 1;
  300.             if ((v1 < -128) || (v1 > 127))
  301.                 aerr();
  302.             outab(v1);
  303.         } else {
  304.             outrb(&e2, R_PCR);
  305.         }
  306.         if (e2.e_mode != S_USER)
  307.             rerr();
  308.         break;
  309.  
  310.     case S_DBNZ:
  311.         t1 = addr(&e1);
  312.         comma();
  313.         expr(&e2, 0);
  314.         if (t1 == S_DIR || t1 == S_EXT) {
  315.             outab(op);
  316.             outrb(&e1, R_PAG0);
  317.         } else
  318.         if (t1 == S_IX) {
  319.             outab(op+0x40);
  320.         } else
  321.         if (t1 == S_IX1 || t1 == S_IX2) {
  322.             if (chkindx(&e1))
  323.                 aerr();
  324.             outab(op+0x30);
  325.             outrb(&e1, R_USGN);
  326.         } else
  327.         if (t1 == S_SP1 || t1 == S_SP2) {
  328.             if (chkindx(&e1))
  329.                 aerr();
  330.             outab(0x9E);
  331.             outab(op+0x30);
  332.             outrb(&e1, R_USGN);
  333.         } else {
  334.             aerr();
  335.             break;
  336.         }
  337.         if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
  338.             v1 = e2.e_addr - dot.s_addr - 1;
  339.             if ((v1 < -128) || (v1 > 127))
  340.                 aerr();
  341.             outab(v1);
  342.         } else {
  343.             outrb(&e2, R_PCR);
  344.         }
  345.         if (e2.e_mode != S_USER)
  346.             rerr();
  347.         break;
  348.  
  349.     case S_DZAX:
  350.         expr(&e1, 0);
  351.         outab(op);
  352.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  353.             v1 = e1.e_addr - dot.s_addr - 1;
  354.             if ((v1 < -128) || (v1 > 127))
  355.                 aerr();
  356.             outab(v1);
  357.         } else {
  358.             outrb(&e1, R_PCR);
  359.         }
  360.         if (e1.e_mode != S_USER)
  361.             rerr();
  362.         break;
  363.  
  364.     case S_MOV:
  365.         t1 = addr(&e1);
  366.         if (t1 == S_IX1P || t1 == S_IX2P) {
  367.             if (chkindx(&e1))
  368.                 aerr();
  369.             outab(op+0x10);
  370.             outrb(&e1, R_PAG0);
  371.             break;
  372.         }
  373.         comma();
  374.         t2 = addr(&e2);
  375.         if (t1 == S_IMMED) {
  376.             if (t2 == S_DIR || t2 == S_EXT) {
  377.                 outab(op+0x20);
  378.                 outrb(&e1, 0);
  379.                 outrb(&e2, R_PAG0);
  380.                 break;
  381.             }
  382.         }
  383.         if (t1 == S_DIR || t1 == S_EXT) {
  384.             if (t2 == S_DIR || t2 == S_EXT) {
  385.                 outab(op);
  386.                 outrb(&e1, R_PAG0);
  387.                 outrb(&e2, R_PAG0);
  388.                 break;
  389.             }
  390.         }
  391.         if (t1 == S_IXP) {
  392.             if (t2 == S_DIR || t2 == S_EXT) {
  393.                 outab(op+0x30);
  394.                 outrb(&e2, R_PAG0);
  395.                 break;
  396.             }
  397.         }
  398.         aerr();
  399.         break;
  400.  
  401.     default:
  402.         err('o');
  403.     }
  404. }
  405.  
  406. /*
  407.  * Check index byte
  408.  */
  409. int
  410. chkindx(exp)
  411. struct expr *exp;
  412. {
  413.     if (exp->e_flag == 0 && exp->e_base.e_ap == NULL) {
  414.         if (exp->e_addr & ~0xFF) {
  415.             return(1);
  416.         }
  417.     }
  418.     return(0);
  419. }
  420.  
  421. /*
  422.  * The next character must be a
  423.  * comma.
  424.  */
  425. int
  426. comma()
  427. {
  428.     if (getnb() != ',')
  429.         qerr();
  430.     return(1);
  431. }
  432.  
  433. /*
  434.  * Machine specific initialization.
  435.  */
  436. VOID
  437. minit()
  438. {
  439. }
  440.